<?php namespace Home\Controller; 
use Hdphp\Controller\Controller;
//商品列表控制器
class ListController extends Controller{

	//构造函数
	public function __init()
	{
		parent::__init();
	}
    public function index(){
    	//获得分类ID
		$cate_id = Q('get.cate_id',0,'intval');
	
		
		
		$gcateModel = new \Common\Model\Gcate;
		$goodsModel = new \Common\Model\Goods;
		//获得所有分类
		$gcateAll = $gcateModel->get();
				
		//==============================
		//获取分类下的所有子元素的数据
        $cateSonData = $this->getSon($gcateAll,$cate_id);
		//p($cateSonData);exit;
		//将当前分类也压入到子分类里面
        $cateSonData[] = $cate_id;
		
		//1.商品列表 (检索出 该分类以及该分类一下的商品)
        //分类表 关联 商品表，获取当前分类下所有商品 （即取出某一分类下的商品）
        $goodsData = $gcateModel->join('goods','gcategory_cate_id','=','cate_id')
        						->where("cate_id in (".implode(',',$cateSonData).")")
								->orderBy('add_time','DESC')
        						->get();
		//p($goodsData);exit;						
		View::with('goodsData',$goodsData);
		
		//2.统计当前分类下商品数目
		//分类表 关联 商品表，统计当前分类下商品数目
		$goodsCount = $gcateModel->join('goods','gcategory_cate_id','=','cate_id')
							     ->where("cate_id in (".implode(',',$cateSonData).")")
							     ->count();
		View::with('goodsCount',$goodsCount);
		
		//3.当前位置
		$currentNav = $this->getfather($gcateAll, $cate_id);
		$currentNav = $this->unListArr($currentNav);
		//p($currentNav);exit;
		View::with('currentNav',$currentNav);
		
		//获取分类信息 为了SEO
		$gcateData = $this->get_gcates();
		View::with('gcateData',$gcateData);
		
		//=====================当前父级下面的子集   开始=====================
		//通过cid，找对应子集的内容   lists()方法  从表中取出指定的字段。
		//如果 传过来是 是羽绒服的cate_id 19  
		$cids = $gcateModel->where("p_id={$cate_id}")->lists('cate_id');
		// 检索 19，$cids下面没有子集
		//p($cids);
/*Array
(
    [0] => 19  羽绒服
    [1] => 20  毛衣
    [2] => 21
    [3] => 22
    [4] => 23
    [5] => 24
    [6] => 25
    [7] => 26
)*/
		if($cids){
			//羽绒服的cate_id 19  不走这个if体
			//通过子集cid，找到对应的子类
			$gcateDatas = $gcateModel->where("cate_id in (" . implode(',',$cids) . ")")->field('cate_id,cate_name')->get();
		}else{
			//找 19 的父级  （即 查询 19这条数据，找出 19这条数据里的 父p_id这个字段，看父id是谁，取出来，赋给 变量$pid）
			//如果cid不存在，停留   在当前父级     找到当前父级
			$pid = $gcateModel->where("cate_id={$cate_id}")->pluck('p_id');
			//p($pid);
			//找到 19的 父p_id=16，找16这个父id当前的子集。即 停留在当前父id上。（要理解！！写着写着就蒙圈了。。多想。）
			//找当前父级 对应子集的内容
			$gcateDatas = $gcateModel->where('p_id=' . $pid)->get();
			//p($gcateDatas);
		}	
		//p($gcateDatas);
		View::with('gcateDatas',$gcateDatas);
		//=====================当前父级下面的子集   结束=====================
	
	
		//1.通过当前的cid获得对应的商品的gids
		$gids = $this->cidGetGids(Q('get.cate_id',0,'intval'));
		//p($gids);
		//2.根据gids找到商品属性
		$goodsAttr = $this->gidGetAttr($gids);
		//p($goodsAttr);
		View::with('goodsAttr',$goodsAttr);
	
	
        View::make();
    }


	//通过gid获得商品的属性
	private function gidGetAttr($gids){
		//==============商品属性表goods_attr
		//1.去商品属性表goods_attr里 取数据   怎么取，依据传来的$gids, 因为传来的gids是数组，所以在sql查询的是好，需要使用implode()将其转为 字符串
		//原生sql  SELECT * FROM goods_attr WHERE goods_goods_id in(2,3,12,4,5,13,14,7,8,9,10,11,15) GROUP BY ga_value ;
		//根据gids 取出商品属性表里的对应数据。
		$data = Db::table('goods_attr')->where("goods_goods_id in(" . implode(',', $gids) . ")")->groupBy('ga_value')->get();
		//p($data);
		//2.把相同类型属性ga_id的 归结在一起
		$sameAttr = array();
		foreach($data as $v){
			$sameAttr[$v['ga_id']][] = $v;//依他$v['ga_id']为键名，把$data数组里的$v 压入到 临时数组 $sameAttr[][] 里。
		}
		p($sameAttr);
		//==============类型属性表fattr
		//3.组合数组
		$temp = array();
		foreach($sameAttr as $fa_id => $v){
			$temp[] = array(
				'name' =>Db::table('fattr')->where("fa_id={$fa_id}")->pluck('fattr_name'),
				'value' => $v
			);
		}
		return $temp;
	}

    //通过cid获得gids  例如 点击 羽绒服  cate_id=19
    private function cidGetGids($cid){
    	//1.通过当前分类cid获得对应的所有的子集cid
    	$cids = $this->getSon(Db::table('gcategory')->get(), $cid);
		$cids[] = $cid;//因为传进来的当前的cid他本身也有可能有商品，所以把自己也压进去。
		//2.通过子集cid 找到 对应的 商品的 gid
		$gids = Db::table('goods')->where("gcategory_cate_id in(" . implode(',', $cids) . ")")->lists('goods_id');
		//p($gids);
/*Array
(
    [0] => 3
    [1] => 12
    [2] => 4
    [3] => 5
    [4] => 13
    [5] => 7
    [6] => 8
    [7] => 9
    [8] => 10
    [9] => 11
    [10] => 15
)*/
		//返出 找到的$gids
		return $gids;
    }

    //获得所有的子集cid
    public function getSon($data,$cate_id){
        $temp=array();
        foreach ($data as $v) {
            if($v['p_id'] == $cate_id){
                //把子集的cid压入到temp临时数组
                $temp[] = $v['cate_id'];
                //合并数组， 组合成新数组
                $temp = array_merge($temp,$this->getSon($data,$v['cate_id']));
            }
        }
        return $temp;
    }

	//当前位置(获取某一个元素的所有父级分类)
    public function getfather($data,$p_id){
//        p($data);
        $temp=array();
        foreach($data as $v){
//            $v
            if($v['cate_id']==$p_id){
                $temp[]=$v;
                $temp=array_merge($temp,$this->getfather($data,$v['p_id']));
            }
//            p($temp);
        }
        return $temp;

    }
	
    public function unListArr($data){
        for($i=0;$i<count($data);$i++){
            $arr[] = $data[count($data)-$i-1];
        }
        if(isset($arr)){
            return $arr;
        }else{
        	return 0;
		}
    }

	//获取分类数据 为了SEO
	public function get_gcates(){
		$gcategoryModel = new \Common\Model\Gcate;
		$gcateData = $gcategoryModel->where("cate_id=" . Q('get.cate_id',0,'intval'))->find();
		//p($gcateData);exit;
		return $gcateData;
	}
	
}